package com.rengwuxian.coursecoroutines._1_basics

import android.os.Bundle
import android.widget.TextView
import androidx.activity.ComponentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewModelScope
import com.rengwuxian.coursecoroutines.R
import com.rengwuxian.coursecoroutines.common.Contributor
import com.rengwuxian.coursecoroutines.common.gitHub
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

/**
 * Android项目里协程代码的写法
 * lifecycleScope、viewModelScope、Dispatchers.Main.immediate
 *
 * 服务端写协程是不需要关注的。
 *
 * 客户端项目：
 * 正式项目中：都是在主线程开启协程，然后协程内部调用挂起函数来切后台任务，然后再切回到主线程中更新UI界面。
 * Jetpack库中有很多ktx封装了协程的扩展属性。
 * ComponentActivity、Fragment都有LifecycleOwner
 * lifecycleScope：
 *    是一个现成的CoroutineScope，跟当前所在组件的生命周期绑定的。生命周期结束时，会取消该CoroutineScope中的所有协程。
 *    内置了主线程的ContinuationInterceptor，Dispatchers.Main.immediate(和Dispatchers.Main的区别，是否需要判断是否在主线程，再抛入主线程运行)
 *
 * ViewModel的viewModelScope，需要引入对应lifecycle-viewmodel-ktx库, 扩展属性库。
 *
 */
class AndroidActivity : ComponentActivity() {
  private lateinit var infoTextView: TextView

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.layout_1)
    infoTextView = findViewById(R.id.infoTextView)

    // KTX
    lifecycleScope.launch {

    }
    // ContinuationInterceptor
    Dispatchers.Default
    // Handler.post()
  }

  class MyViewModel : ViewModel() {
    fun someFun() {
      viewModelScope.launch {

      }
    }
  }

  private fun coroutinesStyle() = lifecycleScope.launch {
    val contributors = gitHub.contributors("square", "retrofit")
    showContributors(contributors)
  }

  private fun showContributors(contributors: List<Contributor>) = contributors
    .map { "${it.login} (${it.contributions})" }
    .reduce { acc, s -> "$acc\n$s" }
    .let { infoTextView.text = it }
}